package pe.edu.upc.e41a.javasoft.jsf;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.faces.application.Application;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.component.html.HtmlPanelGrid;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.component.message.Message;
import org.primefaces.component.spinner.Spinner;
import org.primefaces.context.RequestContext;
import org.primefaces.event.CloseEvent;
import org.primefaces.event.SelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.roo.addon.jsf.managedbean.RooJsfManagedBean;
import org.springframework.roo.addon.serializable.RooSerializable;

import pe.edu.upc.e41a.javasoft.domain.Imagen;
import pe.edu.upc.e41a.javasoft.domain.Publicacion;
import pe.edu.upc.e41a.javasoft.domain.Transaccion;
import pe.edu.upc.e41a.javasoft.domain.Usuario;
import pe.edu.upc.e41a.javasoft.jsf.util.Util;
import pe.edu.upc.e41a.javasoft.service.ImagenService;
import pe.edu.upc.e41a.javasoft.service.PublicacionService;
import pe.edu.upc.e41a.javasoft.service.TransaccionService;

@Configurable
@ManagedBean(name = "beanPublicacion")
//@RequestScoped
@SessionScoped
@RooSerializable
@RooJsfManagedBean(entity = Publicacion.class, beanName = "beanPublicacion")
public class BeanPublicacion implements Serializable {
	

	private static final long serialVersionUID = 1L;

	@Autowired
    PublicacionService publicacionService;
	
	@Autowired
    TransaccionService transaccionService;
	
	@Autowired
    ImagenService imagenService;
	
	private String cadena="";
	private List<Publicacion> publicaciones;
	private List<String> columns;
	private HtmlPanelGrid editPanelGrid;
	private boolean dataVisible = false;
	private Publicacion publicacion;
	private Transaccion transaccion;
	private Usuario usuarioSession;
	
	@PostConstruct
    public void init() {
        columns = new ArrayList<String>();
        columns.add("titulo");
        columns.add("descripcion");
        columns.add("tipo");
        columns.add("cantidad");
        columns.add("precio");
        columns.add("duracion");
        
    }

	public Usuario getUsuarioSession() {
		return usuarioSession;
	}

	public void setUsuarioSession(Usuario usuarioSession) {
		this.usuarioSession = usuarioSession;
	}

	public Publicacion getPublicacion() {
        if (publicacion == null) {
            publicacion = new Publicacion();
        }
        return publicacion;
    }

	public void setPublicacion(Publicacion publicacion) {
        this.publicacion = publicacion;
    }
	
	public Transaccion getTransaccion() {
		if(transaccion==null){
			transaccion=new Transaccion();
		}
		return transaccion;
	}

	public void setTransaccion(Transaccion transaccion) {
		this.transaccion = transaccion;
	}


	public HtmlPanelGrid getEditPanelGrid() {
        if (editPanelGrid == null) {
            editPanelGrid = populateEditPanel();
        }
        return editPanelGrid;
    }

	public void setEditPanelGrid(HtmlPanelGrid editPanelGrid) {
        this.editPanelGrid = editPanelGrid;
    }
	
	public String getCadena() {
		return cadena;
	}

	public void setCadena(String cadena) {
		this.cadena = cadena;
	}

	public List<String> getColumns() {
		return columns;
	}
	
	public List<Publicacion> getPublicaciones() {
		return publicaciones;
	}

	public void setPublicaciones(List<Publicacion> publicaciones) {
		this.publicaciones = publicaciones;
	}

	public String buscarPublicacionPorTituloODescripcion(String cadena) {
		publicaciones = publicacionService.listarPublicacionPorTituloODescripcion(cadena);
		for(Publicacion p: publicaciones){
			Imagen i=imagenService.buscarImagen(p);
			if(i!=null){
				p.setNombreimagen(i.getNombre());
			}
			
		}
		dataVisible = !publicaciones.isEmpty();
        return null;
    }
	
	public String displayList() {
      buscarPublicacionPorTituloODescripcion(cadena);
      return "busqueda";
    }
	
	/*public String buscarCategoria() {
		System.out.println("Entro a metdo buscarCategoria()");
		publicaciones=publicacionService.listarPorCategoria(publicacion.getCategoria());
	    return "busqueda";
	}*/
	
	public boolean isDataVisible() {
		return dataVisible;
	}

	public void setDataVisible(boolean dataVisible) {
		this.dataVisible = dataVisible;
	}
	
	public HtmlPanelGrid populateEditPanel() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Application application = facesContext.getApplication();
        ExpressionFactory expressionFactory = application.getExpressionFactory();
        ELContext elContext = facesContext.getELContext();
        
        HtmlPanelGrid htmlPanelGrid = (HtmlPanelGrid) application.createComponent(HtmlPanelGrid.COMPONENT_TYPE);
        
        HtmlOutputText cantidadEditOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        cantidadEditOutput.setId("cantidadEditOutput");
        cantidadEditOutput.setValue("Cantidad: * ");
        htmlPanelGrid.getChildren().add(cantidadEditOutput);
        
        Spinner cantidadEditInput = (Spinner) application.createComponent(Spinner.COMPONENT_TYPE);
        cantidadEditInput.setId("cantidadEditInput");
        cantidadEditInput.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{beanPublicacion.publicacion.cantidad}", Integer.class));
        cantidadEditInput.setRequired(true);
        cantidadEditInput.setMin(1);
                
        htmlPanelGrid.getChildren().add(cantidadEditInput);
        
        Message cantidadEditInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        cantidadEditInputMessage.setId("cantidadEditInputMessage");
        cantidadEditInputMessage.setFor("cantidadEditInput");
        cantidadEditInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(cantidadEditInputMessage);
        
        return htmlPanelGrid;
    }
	
	 public String buscarPublicacion() {  
		 buscarPublicacionPorTituloODescripcion(cadena);
	     return "busqueda.xhtml?faces-redirect=true";
		 
	 }

	 public void reset() {
	        publicacion = null;
	        transaccion=null;
	 }
	 
	 public void handleDialogClose(CloseEvent event) {
	        reset();
	 }
	 
	 public void fijarUsuarioSession(){
			FacesContext context = FacesContext.getCurrentInstance();
			HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
			usuarioSession = ((Usuario)session.getAttribute("usuarioSession"));
			transaccion.setUsuario(usuarioSession);
		
		}
	 
	 public String realizarCompra() {
        String message = "";
        fijarUsuarioSession();
        try{
        	if (usuarioSession==null) {
            	message="Debe iniciar  sesión para realizar compra";
    		}else {
    			if (publicacion.getCodigo() != null) {
    	        	if(publicacion.getCantidad()>transaccion.getCantidad()){
    	        		fijarUsuarioSession();
    	            	transaccion.setPublicacion(publicacion);
    	            	transaccion.setFechaRegistro(Util.stringToDate("19/02/2012"));
    	            	message=transaccionService.registrarCompra(transaccion);
    	        	}
    	        }
    		}
        }catch(Exception e){
        	message="Debe iniciar  sesión para realizar compra";
        }
        
        
        
        
        if(!(message.equals(""))){
        	FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_INFO, message,"");
            FacesContext.getCurrentInstance().addMessage(null, facesMessage);
            reset();
        }else{
        	FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, message,"");
            FacesContext.getCurrentInstance().addMessage(null, facesMessage);
        }
        RequestContext context1 = RequestContext.getCurrentInstance();
        context1.execute("editDialog.hide()");
        return buscarPublicacionPorTituloODescripcion("");
        
        
	 }
	 
	 //<f:setPropertyActionListener value="#{publicaciones}" target="#{beanPublicacion.publicacion}" />
	 public void onRowSelect(SelectEvent event) {  
		 System.out.println(publicacion.getTitulo());
  
	 }
	 
	public String mostrar()
	{
		/*buscarPublicacion(publicacion);
		System.out.println(publicacion.getTitulo());*/
		System.out.println("publicaciones : "+publicacion.getNombreimagen());
		return "publicacionMostrar.xhtml?faces-redirect=true";
	}
		
			public Publicacion buscarPublicacion(Publicacion publicacion)
			{//asi 
				
				publicacion=publicacionService.findPublicacion(publicacion.getCodigo());	
				System.out.println(publicacion.getTitulo());
				System.out.println(publicacion.getNombreimagen());
				
				return publicacion;
				
				
			}
}
